package com.zjsru.plan2024.oneday;

/**
 * 3184. 构成整天的下标对数目 I
 *
 * @Author: cookLee
 * @Date: 2024-10-22
 */
public class CountCompleteDayPairs {

    /**
     * 主
     * \
     * 输入： hours = [12,12,30,24,24]
     * <p>
     * 输出： 2
     * <p>
     * 解释：
     * <p>
     * 构成整天的下标对分别是 (0, 1) 和 (3, 4)。
     * \
     * 输入： hours = [72,48,24,3]
     * <p>
     * 输出： 3
     * <p>
     * 解释：
     * <p>
     * 构成整天的下标对分别是 (0, 1)、(0, 2) 和 (1, 2)。
     * \
     *
     * @param args args
     */
    public static void main(String[] args) {
        CountCompleteDayPairs countCompleteDayPairs = new CountCompleteDayPairs();
        int[] hours = new int[]{12, 12, 30, 24, 24};
        System.out.println(countCompleteDayPairs.countCompleteDayPairs2(hours));
    }

    /**
     * 计算完整日对:两数和
     *
     * @param hours 小时数
     * @return int
     */
    public int countCompleteDayPairs(int[] hours) {
        int len = hours.length;
        int ans = 0;
        for (int i = 0; i < len; i++) {
            for (int j = i + 1; j < len; j++) {
                if ((hours[i] + hours[j]) % 24 == 0) {
                    ans++;
                }
            }
        }
        return ans;
    }

    /**
     * 计算完整一天对2
     *
     * @param hours 小时数
     * @return long
     */
    public long countCompleteDayPairs2(int[] hours) {
        final int H = 24;
        long ans = 0;
        int[] cnt = new int[H];
        for (int hour : hours) {
            // 先查询 cnt，再更新 cnt，因为题目要求 i < j
            // 如果先更新，再查询，就把 i = j 的情况也考虑进去了
            ans += cnt[(H - hour % H) % H];
            cnt[hour % H]++;
        }
        return ans;
    }


}
